home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / body.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  3KB  |  149 lines

  1. /* -------------------------------- body.c ---------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Handle body descriptions.
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12.  
  13. LOCAL_FUNC int NEAR
  14. init_internals (void)
  15. {
  16.     st.bodies[O_GROUND]  = &BoGround;
  17.     st.bodies[O_BOX]     = &BoBox;
  18.     st.bodies[O_PLANE]   = &BoPlane;
  19.     st.bodies[O_RUNWAY]  = &BoRunway;
  20.     st.bodies[O_M61]     = &BoM61;
  21.     st.bodies[O_TARGET]  = &BoTarget;
  22.     st.bodies[O_BROKEN]  = &BoBroken;
  23.     st.bodies[O_VIEWER]  = &BoViewer;
  24.     st.bodies[O_CHUTE]   = &BoChute;
  25.     st.bodies[O_HOUSE]   = &BoHouse;
  26.     st.bodies[O_TOWER]   = &BoTower;
  27.     st.bodies[O_LOW]     = &BoLow;
  28.     st.bodies[O_GTARGET] = &BoGtarget;
  29.     st.bodies[O_MK82]    = &BoMK82;
  30.     st.bodies[O_CRATER]  = &BoCrater;
  31.     st.bodies[O_SMOKE]   = &BoSmoke;
  32.  
  33.     return (0);
  34. }
  35.  
  36. extern BODY * FAR
  37. bodies_new (ONAME n)
  38. {
  39.     BODY    *b;
  40.  
  41.     if (n >= 0) {
  42.         if (n < 0 || n >= O_ALL || st.bodies[n])
  43.             return (0);
  44.     } else {
  45.         for (n = O_LOCAL; st.bodies[n]; ++n)
  46.             if (n >= O_ALL)
  47.                 return (0);
  48.     }
  49.  
  50.     if (!NEW (b))
  51.         return (0);
  52.  
  53.     st.bodies[n] = b;
  54.     b->name = n;
  55.  
  56.     return (b);
  57. }
  58.  
  59. extern void FAR
  60. bodies_extent (ONAME name)
  61. {
  62.     Uint    extent;
  63.     VERTEX    *v;
  64.  
  65.     extent = 0;
  66.     for (v = st.bodies[name]->shape->v; v->flags; ++v) {
  67.         if (extent < iabs(v->V[X]))
  68.             extent = iabs (v->V[X]);
  69.         if (extent < iabs(v->V[Y]))
  70.             extent = iabs (v->V[Y]);
  71.         if (extent < iabs(v->V[Z]))
  72.             extent = iabs (v->V[Z]);
  73.     }
  74.     if (st.bodies[name]->shape->flags & SH_FINE)
  75.         extent /= VONE;
  76.     if (0 == extent)
  77.         extent = 1;
  78.     st.bodies[name]->shape->extent = (Ushort)extent;
  79. }
  80.  
  81. extern int FAR
  82. bodies_init (void)
  83. {
  84.     ONAME    i;
  85.  
  86.     if (!(st.bodies = (BODY **)memory_calloc (O_ALL+1, sizeof (BODY *))))
  87.         return (1);
  88.  
  89.     if (init_internals ())
  90.         return (1);
  91.  
  92.     for (i = 0; st.bodies[i]; ++i) {
  93.         st.bodies[i]->name = i;
  94.         if (st.bodies[i]->init && st.bodies[i]->init(st.bodies[i]))
  95.             return (1);
  96.         bodies_extent (i);
  97.     }
  98.     return (0);
  99. }
  100.  
  101. extern BODY * FAR
  102. bodies_del (ONAME name)
  103. {
  104.     if (name < 0 || name >= O_ALL || !st.bodies || !st.bodies[name])
  105.         return (0);
  106.  
  107.     if (st.bodies[name]->term)
  108.         st.bodies[name]->term(st.bodies[name]);
  109.  
  110.     if (name >= O_INT)
  111.         DEL0 (st.bodies[name]);
  112.     else
  113.         st.bodies[name] = 0;
  114.     return (0);
  115. }
  116.  
  117. extern void FAR
  118. bodies_term (void)
  119. {
  120.     ONAME    name;
  121.  
  122.     if (!st.bodies)
  123.         return;
  124.  
  125.     for (name = 0; name < O_ALL; ++name) {
  126.         if (!st.bodies[name])
  127.             continue;
  128.         bodies_del (name);
  129.     }
  130.  
  131.     st.bodies = memory_cfree (st.bodies, O_ALL+1, sizeof (*st.bodies));
  132. }
  133.  
  134. extern ONAME FAR
  135. body_name (char *title)
  136. {
  137.     int    i;
  138.  
  139.     if (!st.bodies)
  140.         return (-1);
  141.  
  142.     for (i = 0; i < O_ALL; ++i) {
  143.         if (st.bodies[i] && !stricmp (st.bodies[i]->title, title))
  144.             return (i);
  145.     }
  146.  
  147.     return (-1);
  148. }
  149.